#include"thttpd.h"
#include <sys/types.h>
#include <sys/wait.h>

static void* msg_request(void *arg)
{
	//这里客户端描述符通过参数传进来了
	int sock=(int)arg;
	//int sock = *(int *)arg;

	// 一般情况下，线程终止后，其终止状态一直保留到其它线程调用pthread_join获取它的状态为止。
	//但是线程也可以被置为detach状态，这样的线程一旦终止就立刻回收它占用的所有资源，而不保留终止状态。
	//pthread_self():获取自身的线程id

	pthread_detach(pthread_self());	//pthread_detach设置线程的状态,将其变为游离态,结束后自行回收

	// handler_msg 作为所有的 请求处理 入口

	//int hand = handler_msg(sock);
	//void *a = (void *)hand;  //void *a:void *是函数是void*类型,后面的(void *),是需要将hand转为(void *)类型
	//return a;
	return (void *)handler_msg(sock);//
	//msg_request的返回值是handler_msg函数返回值强转成void *型之后的值
}  

int main(int argc,char* argv[])
{
	//如果不传递端口，那么使用默认端口80
	int port = 80;

	if(argc > 1)   //命令行输入>1,即端口号
	{
		port = atoi(argv[1]);
	}

	//初始化服务器
	int lis_sock=init_server(port);

	while(1) //循环等待连接
	{
		struct sockaddr_in peer;  //结构体变量
		socklen_t len=sizeof(peer);
		
		int sock=accept(lis_sock,(struct sockaddr*)&peer,&len);  //建立连接
		
		if(sock<0)
		{
			perror("accept failed");
			continue;
		}
		
		//每次接收一个链接后，会自动创建一个线程，这实际上就是线程并发服务器模型的应用
		pthread_t tid;
		if(pthread_create(&tid,NULL,msg_request,(void*)sock)>0)  //msg_request线程处理函数/子线程名  //调用线程处理函数
		{
			perror("pthread_create failed");
			close(sock);
		}
	}
	return 0;
}
